home *** CD-ROM | disk | FTP | other *** search
- /****i* SOURCE_FILE/INFO
- *
- * NAME
- * DateFormat.js
- *
- * USAGE
- * Part of Netobjects JavaScript Library.
- *
- * COPYRIGHT
- * Copyright ⌐ 2000-2005 Website Pros, Inc.
- * All Rights Reserved.
- *
- * This is an unpublished work protected by Website Pros, Inc.
- * as a trade secret, and is not to be used or disclosed except as
- * expressly provided in a written license agreement executed by
- * you and Website Pros, Inc.
- *
- * <copyright@websitepros.com>
- *
- * NOTES
- * JavaScript code.
- *
- *****/
-
- if (!IS.isModuleInitialized("IS.NOF.TEXT.DateFormat"))
- {
-
- /****h* NOF_JavaScript_Library/NOF.TEXT.DateFormat
- *
- * NAME
- * NOF.TEXT.DateFormat
- *
- * DESCRIPTION
- *
- * <code>DateFormat</code> is a class which provides a simple way to
- * format a Date using locale specific settings.
- * Usage sample:
- *
- * var myLocale = new NOF.UTIL.Locale("de", "DE");
- * var df = new NOF.TEXT.DateFormat(myLocale);
- * var str = df.format( new Date() );
- * alert( str );
- *
- * External dependencies: NOF.UTIL.Locale, NOF.UTIL.DefaultLocale, NOF.UTIL.ResourceBundle, NOF.UTIL.Exception
- ****/
-
- /**
- * Constructor
- * @param locale
- * @param pattern
- **/
- function TEXT_DateFormat(/*NOF.UTIL.Locale*/ locale, /*String*/ pattern) {
- this.__proto__ = TEXT_DateFormat.prototype;
-
- this.locale = locale;
- this.pattern = pattern;
-
- this.DateFormatSymbols = null;
- }
- {
- var method = TEXT_DateFormat.prototype;
- method.SYMBOLS_RESOURCE = "lib/nof/text/DateFormatSettings";
-
- method.TEXT_DateFormatSymbols = function () {
- this.MonthNames = arguments[0].split(",");//["January", "February", "March", "April", "May", "June", "July", "August", "September", "Octomber", "November", "December"]
- this.MonthAbbreviations = arguments[1].split(",");//["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]
- this.DayNames = arguments[2].split(",");//["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
- this.DayAbbreviations = arguments[3].split(",");//["M","Tue","W","Th","F","Sat","Sun"]
- this.AmPmMarkers = arguments[4].split(",");//["am","pm"]
- //this.datePattern=M/d/yy
- //this.timePattern=h:mm:ss a
- this.defaultPattern = arguments[5];//M/d/yy h:mm a
- this.LocalPatternChars = arguments[6];//GyMdkHmsSEDFwWahKzZ
- }
-
- method.PATTERN_CHARS = "GyMdkHmsSEDFwWahKzZ";
- /*
- G Era designator Text AD
- y Year Year 1996; 96
- M Month in year Month July; Jul; 07
- w Week in year Number 27
- W Week in month Number 2
- D Day in year Number 189
- d Day in month Number 10
- F Day of week in month Number 2
- E Day in week Text Tuesday; Tue
- a Am/pm marker Text PM
- H Hour in day (0-23) Number 0
- k Hour in day (1-24) Number 24
- K Hour in am/pm (0-11) Number 0
- h Hour in am/pm (1-12) Number 12
- m Minute in hour Number 30
- s Second in minute Number 55
- S Millisecond Number 978
- z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
- Z Time zone RFC 822 time zone -0800
- */
-
- method.TEXT_CharsPatternDate = function (/*String*/ localPatternChars, /*String*/ patternChars) {
- //alert(" TEXT_CharsPatternDate localPatternChars="+localPatternChars+", patternChars="+patternChars);
- this.eraChar = localPatternChars.charAt(patternChars.indexOf("G"));
- this.yearChar = localPatternChars.charAt(patternChars.indexOf("y"));
- this.monthChar = localPatternChars.charAt(patternChars.indexOf("M"));
-
- this.week_in_yearChar = localPatternChars.charAt(patternChars.indexOf("w"));
- this.week_in_monthChar = localPatternChars.charAt(patternChars.indexOf("W"));
-
- this.day_in_yearChar = localPatternChars.charAt(patternChars.indexOf("D"));
- this.day_in_monthChar = localPatternChars.charAt(patternChars.indexOf("d"));
- this.day_in_week_intChar = localPatternChars.charAt(patternChars.indexOf("F"));
- this.day_in_week_strChar = localPatternChars.charAt(patternChars.indexOf("E"));
-
- this.hour_in_day0_23Char = localPatternChars.charAt(patternChars.indexOf("H"));
- this.hour_in_day1_24Char = localPatternChars.charAt(patternChars.indexOf("k"));
- this.hour_in_AmPm0_11Char = localPatternChars.charAt(patternChars.indexOf("K"));
- this.hour_in_AmPm1_12Char = localPatternChars.charAt(patternChars.indexOf("h"));
-
- this.minuteChar = localPatternChars.charAt(patternChars.indexOf("m"));
- this.secondChar = localPatternChars.charAt(patternChars.indexOf("s"));
- this.millisChar = localPatternChars.charAt(patternChars.indexOf("S"));
-
- this.markerAMPMChar = localPatternChars.charAt(patternChars.indexOf("a"));
-
- this.timeZoneGeneralChar = localPatternChars.charAt(patternChars.indexOf("z"));
- this.timeZoneRFC822Char = localPatternChars.charAt(patternChars.indexOf("Z"));
-
- return this;
- }
-
- method.getDateFormatSymbols = function(/*NOF.UTIL.Locale*/ locale) {
- if (locale == null) {
- locale = this.locale;
- }
- var propSymbols = NOF.UTIL.ResourceBundle.getBundle(this.SYMBOLS_RESOURCE, locale);
- if (propSymbols == null) {
- return null;
- } else {
- return new this.TEXT_DateFormatSymbols(
- propSymbols.getProperty("MonthNames"),
- propSymbols.getProperty("MonthAbbreviations"),
- propSymbols.getProperty("DayNames"),
- propSymbols.getProperty("DayAbbreviations"),
- propSymbols.getProperty("AmPmMarkers"),
- propSymbols.getProperty("defaultPattern"),
- propSymbols.getProperty("LocalPatternChars")
- );
- }
- }
-
- /**
- * Set locale
- * @param locale - specific locale
- **/
- method.setLocale = function (/*NOF.UTIL.Locale*/ locale) {
- if ( (locale != null) && (this.locale.equals(locale) == false) ) {
- this.locale = locale;
- this.DateFormatSymbols = this.getDateFormatSymbols(locale);
- }
- }
- /**
- * Get locale
- * @return locale
- **/
- /*NOF.UTIL.Locale*/ method.getLocale = function () {
- return this.locale;
- }
-
- /**
- * Set pattern
- * @param pattern
- **/
- method.setPattern = function (/*String*/ pattern) {
- if ( (pattern != null) && (this.pattern != pattern) ) {
- this.pattern = pattern;
- }
- }
- /**
- * Get pattern
- * @return pattern
- **/
- /*String*/ method.getPattern = function () {
- return this.pattern;
- }
-
- /**
- * format a date
- * @param n the number
- * @param locale (optional) - specific locale
- * @return the string obtained by formating the date
- **/
- /*String*/ method.format = function (/*Date*/ date,/*NOF.UTIL.Locale*/ locale) {
- if (date == null) return null;
-
- var year = date.getFullYear(); //date.getYear();
- var month_in_year = date.getMonth();
- var day_in_month = date.getDate();
- var day_in_week_int = date.getDay();
- var hours = date.getHours();
- var minutes = date.getMinutes();
- var seconds = date.getSeconds();
- var milliseconds = date.getMilliseconds();
-
- var dfs = null;
- if (locale != null) {
- dfs = this.getDateFormatSymbols(locale);
- } else { //no locale argument
- if (this.DateFormatSymbols == null) { //first call
- locale = (this.locale != null) ? this.locale : NOF.UTIL.DefaultLocale;
- this.DateFormatSymbols = this.getDateFormatSymbols(locale);
- }
- dfs = this.DateFormatSymbols;
- }
- var pattern = this.getPattern();
- if (pattern == null || pattern.trim().length == 0) {
- pattern = dfs.defaultPattern;
- }
-
- var localPatternChars = dfs.LocalPatternChars;
-
- var chPatternDate = new this.TEXT_CharsPatternDate(localPatternChars, this.PATTERN_CHARS);
-
- var pArr = this.parsePattern(pattern, localPatternChars);
-
- var pArrItem;
- var str = "";
- for (var i = 0; i < pArr.length; i++) {
- pArrItem = pArr[i];
- if (typeof(pArrItem) == 'string') {
- //alert("i == " + i + ", pArrItem == " + pArrItem);
- str += pArrItem;
- } else {
- //alert("i == " + i + ", pArrItem == " + pArrItem.ch + ", l==" + pArrItem.l);
- switch (pArrItem.ch) {
- case (chPatternDate.yearChar): {
- str += (""+year).substring(4 - pArrItem.l);
- break;
- }
- case (chPatternDate.monthChar): {
- if (pArrItem.l == 2) {
- if (month_in_year < 9) {
- str += "0" + (month_in_year + 1);
- break;
- }
- }
- str += (month_in_year + 1);
- break;
- }
- case (chPatternDate.day_in_monthChar): {
- if (pArrItem.l == 2) {
- if (day_in_month < 10) {
- str += "0" + day_in_month;
- break;
- }
- }
- str += day_in_month;
- break;
- }
- case (chPatternDate.hour_in_day0_23Char): {
- str += hours;
- break;
- }
- case (chPatternDate.hour_in_day1_24Char): {
- str += hours;
- break;
- }
- case (chPatternDate.hour_in_AmPm0_11Char): {
- str += (hours % 12);
- break;
- }
- case (chPatternDate.hour_in_AmPm1_12Char): {
- str += (hours % 12);
- break;
- }
- case (chPatternDate.minuteChar): {
- str += minutes;
- break;
- }
- case (chPatternDate.secondChar): {
- str += seconds;
- break;
- }
- case (chPatternDate.millisChar): {
- str += milliseconds;
- break;
- }
- case (chPatternDate.markerAMPMChar): {
- //alert(dfs.AmPmMarkers);
- str += dfs.AmPmMarkers[parseInt(hours / 12)];
- break;
- }
-
-
- }
- }
- }
-
-
- return str;
- }
-
- /**
- * Get a Date from a formatted string
- * @param source
- * @return the date
- **/
- /*Date*/ method.parse = function (/*String*/ source, /*NOF.UTIL.Locale*/ locale) {
- if (source == null || source.trim().length == 0) {
- return null;
- }
- var date = new Date(0);
-
- var dfs = null;
- if (locale != null) {
- dfs = this.getDateFormatSymbols(locale);
- } else { //no locale argument
- if (this.DateFormatSymbols == null) { //first call
- locale = (this.locale != null) ? this.locale : NOF.UTIL.DefaultLocale;
- this.DateFormatSymbols = this.getDateFormatSymbols(locale);
- }
- dfs = this.DateFormatSymbols;
- }
- var pattern = this.getPattern();
- if (pattern == null || pattern.trim().length == 0) {
- pattern = dfs.defaultPattern;
- }
-
- var localPatternChars = dfs.LocalPatternChars;
- var chPatternDate = new this.TEXT_CharsPatternDate(localPatternChars, this.PATTERN_CHARS);
-
- var pArr = this.parsePattern(pattern + " ", localPatternChars);
- source += " ";
-
- var pArrItem;
- var j, k = -1;
-
-
- for (var i = 1; i < pArr.length; i++) {
- pArrItem = pArr[i];
- if (typeof(pArrItem) == 'string') {
-
- k = source.indexOf(pArrItem);
- if (k > -1) {
- tmpStr = source.substring(0, k);
- source = source.substring(k + pArrItem.length, source.length);
-
- //alert( " pArr[j] = |"+ pArr[i-1] + "|, tmpStr = |" + tmpStr + "|\r\n" + "new source = |" + source + "|");
-
- if (typeof(pArr[i-1]) == 'object') {
- //this.setDateAttributes(date, tmpStr, pArr[i-1]);
- switch (pArr[i-1].ch) {
- case (chPatternDate.yearChar): {
- var year = parseInt(tmpStr);
- if (pArr[i-1].l < 4) {
- if (year >= 70) {
- year = 1900 + year;
- } else {
- year = 2000 + year;
- }
- }
- date.setYear(year);
- //alert(" date.getYear " + date.getYear());
- break;
- }
- case (chPatternDate.monthChar): {
- var month = parseInt(tmpStr);
- date.setMonth(month - 1); //?
- break;
- }
- case (chPatternDate.day_in_monthChar): {
- var day_of_month = parseInt(tmpStr);
- date.setDate(day_of_month); //?
- break;
- }
- case (chPatternDate.hour_in_day0_23Char): {
- var hours = parseInt(tmpStr);
- date.setHours(hours);
- break;
- }
- case (chPatternDate.hour_in_day1_24Char): {
- var hours = parseInt(tmpStr);
- date.setHours(hours);
- break;
- }
- case (chPatternDate.hour_in_AmPm0_11Char): {
- var hours = parseInt(tmpStr);
- date.setHours(hours);
- break;
- }
- case (chPatternDate.hour_in_AmPm1_12Char): {
- var hours = parseInt(tmpStr);
- date.setHours(hours);
- break;
- }
- case (chPatternDate.minuteChar): {
- var minutes = parseInt(tmpStr);
- date.setMinutes(minutes);
- break;
- }
- case (chPatternDate.secondChar): {
- var seconds = parseInt(tmpStr);
- date.setSeconds(seconds);
- break;
- }
- case (chPatternDate.millisChar): {
- var milliseconds = parseInt(tmpStr);
- date.setMilliseconds(milliseconds);
- break;
- }
- case (chPatternDate.markerAMPMChar): {
- var AmPm = tmpStr;
- var hours = date.getHours();
- if (AmPm == dfs.AmPmMarkers[0]) {
- //?
- } else {
- date.setHours(hours + 12);
- }
- //alert("parse : date.getHours == " + date.getHours());
- break;
- }
-
- } //end switch
-
- }
- }
- }
- }
- return date;
- }
-
-
- /**
- *
- * @param pattern
- * @param patternChars
- * @return
- **/
- /*Array*/ method.parsePattern = function (/*String*/ pattern, /*String*/ patternChars) {
- var pArr = [];
- if ((pattern != null) && (pattern.trim().length > 0)) {
-
- var chI;
- for (var i=0; i < pattern.length; /*i++*/) {
- chI = pattern.charAt(i);
- //deal first with comments
- if (chI == "'") {
- var qIndex = pattern.indexOf("'", i+1);
- if (qIndex < 0) {
- throw new NOF.UTIL.Exception("invalid_pattern");
- }
-
- if (qIndex + 1 < pattern.length) {
- if (pattern.charAt(qIndex + 1) == "'") { //we have an escape '
- qIndex = pattern.indexOf("'", qIndex + 2); //search forward
- if (qIndex < 0) {
- throw new NOF.UTIL.Exception("invalid_pattern");
- }
- }
- }
-
- pArr[pArr.length] = pattern.substring(i, qIndex + 1);
- i = qIndex + 1;
- //continue;
-
- } else {
-
- if (patternChars.indexOf(chI) > -1) { //reserved char
- var obj = new Object();
- obj.ch = chI;
- var j = 1;
- while (pattern.charAt(i + j) == chI) {
- j++;
- }
- obj.l = j;
- pArr[pArr.length] = obj;
- i = i + j;
- //continue;
- } else { //separators, spaces
- //alert(chI + "=chI, i = " +i);
-
- var tmpStr = chI;
- var chIJ;
- var j = 0;
- for (;;) {
- j++;
- if (i + j >= pattern.length) {
- break;
- }
- chIJ = pattern.charAt(i + j);
- if( (patternChars.indexOf( chIJ ) < -1) && (chIJ != "'") ) { //is not reserved char
- tmpStr += chIJ;
- } else {
- //j++;
- break;
- }
- }
- pArr[pArr.length] = tmpStr;
- i = i + j;
- //continue;
- }
- }
- }
- }
- return pArr;
- }
- }
- // add it to NOF.TEXT namespace
- TEXT.__proto__.DateFormat = TEXT_DateFormat;
-
- }